package com.sky.common.zlm.param;

import lombok.Data;

/**
 * ZLM 拉流参数选项类
 * 使用 withXXX 方法链式设置属性
 */
@Data
public class StreamProxyOption {
    /**
     * 拉流地址
     */
    private String url;

    /**
     * 拉流重试次数，默认为-1无限重试
     */
    private int retryCount = -1;

    /**
     * rtsp拉流时，拉流方式，0：tcp，1：udp，2：组播
     */
    private int rtpType = 0;

    /**
     * 拉流超时时间，单位秒
     */
    private int timeoutSec;

    /**
     * 是否转换成hls-mpegts协议
     */
    private boolean enableHls;

    /**
     * 是否转换成hls-fmp4协议
     */
    private boolean enableHlsFmp4;

    /**
     * 是否允许mp4录制
     */
    private boolean enableMp4;

    /**
     * 是否转rtsp协议
     */
    private boolean enableRtsp;

    /**
     * 是否转rtmp/flv协议
     */
    private boolean enableRtmp;

    /**
     * 是否转http-ts/ws-ts协议
     */
    private boolean enableTs;

    /**
     * 是否转http-fmp4/ws-fmp4协议
     */
    private boolean enableFmp4;

    /**
     * hls协议是否有人观看才生成
     */
    private boolean hlsDemand;
    /**
     * hls协议是否有人观看才生成
     */
    private boolean rtspDemand;

    /**
     * rtmp协议是否有人观看才生成
     */
    private boolean rtmpDemand;

    /**
     * 协议是否有人观看才生成
     */
    private boolean tsDemand;

    /**
     * fmp4协议是否有人观看才生成
     */
    private boolean fmp4Demand;

    /**
     * 无人观看是否自动关闭流(不触发无人观看hook)
     */
    private boolean autoClose;

    /**
     * 私有构造函数，强制使用 withUrl 创建实例
     */
    private StreamProxyOption(String url) {
        this.url = url;
    }

    /**
     * 创建实例的静态工厂方法
     *
     * @param url 拉流地址
     * @return StreamPullOption实例
     */
    public static StreamProxyOption withUrl(String url) {
        return new StreamProxyOption(url);
    }

    /**
     * 设置重试次数
     * @param retryCount 重试次数
     * @return StreamPullOption实例
     */
    public StreamProxyOption withRetryCount(int retryCount) {
        this.retryCount = retryCount;
        return this;
    }

    /**
     * 设置rtp类型
     * @param rtpType rtp类型
     * @return  StreamPullOption实例
     */
    public StreamProxyOption withRtpType(Integer rtpType) {
        this.rtpType = rtpType;
        return this;
    }

    /**
     * 设置超时时间
     * @param timeoutSec 超时时间单位秒
     * @return StreamPullOption实例
     */
    public StreamProxyOption withTimeoutSec(int timeoutSec) {
        this.timeoutSec = timeoutSec;
        return this;
    }

    /**
     * 设置hls-mpegts协议生效
     * @return StreamPullOption实例
     */
    public StreamProxyOption enableHls() {
        this.enableHls = true;
        return this;
    }

    /**
     * 设置hls-fmp4生效
     * @return StreamPullOption实例
     */
    public StreamProxyOption enableHlsFmp4() {
        this.enableHlsFmp4 = true;
        return this;
    }

    /**
     * 设置允许mp4录制
     * @return  StreamPullOption实例
     */
    public StreamProxyOption enableMp4() {
        this.enableMp4 = true;
        return this;
    }

    /**
     * 设置转rtsp协议
     * @return  StreamPullOption实例
     */
    public StreamProxyOption enableRtsp() {
        this.enableRtsp = true;
        return this;
    }

    /**
     * 设置转rtmp协议
     * @return StreamPullOption实例
     */
    public StreamProxyOption enableRtmp() {
        this.enableRtmp = true;
        return this;
    }

    /**
     * 设置转ts协议
     * @return StreamPullOption实例
     */
    public StreamProxyOption enableTs() {
        this.enableTs = true;
        return this;
    }

    /**
     * 设置转http-fmp4/ws-fmp4协议
     * @return StreamPullOption实例
     */
    public StreamProxyOption enableFmp4() {
        this.enableFmp4 = true;
        return this;
    }

    /**
     * 设置hls协议有人观看才生成
     * @return StreamPullOption实例
     */
    public StreamProxyOption withHlsDemand() {
        this.hlsDemand = true;
        return this;
    }

    /**
     * 设置rtsp协议有人观看才生成
     * @return StreamPullOption实例
     */
    public StreamProxyOption withRtspDemand() {
        this.rtspDemand = true;
        return this;
    }

    /**
     * 设置rtmp协议有人观看才生成
     * @return StreamPullOption实例
     */
    public StreamProxyOption withRtmpDemand() {
        this.rtmpDemand = true;
        return this;
    }

    /**
     * 设置ts协议有人观看才生成
     * @return StreamPullOption实例
     */
    public StreamProxyOption withTsDemand() {
        this.tsDemand = true;
        return this;
    }

    /**
     * 设置fmp4协议有人观看才生成
     * @return StreamPullOption实例
     */
    public StreamProxyOption withFmp4Demand() {
        this.fmp4Demand = true;
        return this;
    }

    /**
     * 设置自动关闭
     * @return StreamPullOption实例
     */
    public StreamProxyOption withAutoClose() {
        this.autoClose = true;
        return this;
    }

}